/*
 * @Author: 13177709051 3506463075@qq.com
 * @Date: 2024-12-02 14:21:22
 * @LastEditors: 13177709051 3506463075@qq.com
 * @LastEditTime: 2024-12-02 14:30:39
 * @FilePath: /example/bind.cpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <iostream>
#include <string>
#include <vector>
#include <functional>

void print(const std::string &str, int num)
{
    std::cout << str << num << std::endl;
}

int main()
{
    using Task = std::function<void(int num)>;
    std::vector<Task> arry;
    arry.push_back(std::bind(print, "hello", std::placeholders::_1));
    arry.push_back(std::bind(print, "hello world!", 10));
    arry.push_back(std::bind(print, "hello C++", 10));
    arry.push_back(std::bind(print, "hello server", 10));
    for(auto &f : arry)
        f(20);
    return 0;
}

// 官⽅⽂档对于bind接⼝的概述解释：Bind function arguments
// 我们可以将bind接⼝看作是⼀个通⽤的函数适配器，它接受⼀个函数对象，以及函数的各项参数，然
// 后返回⼀个新的函数对象，但是这个函数对象的参数已经被绑定为设置的参数。运⾏的时候相当于总
// 是调⽤传⼊固定参数的原函数。
// 但是如果进⾏绑定的时候，给与的参数为 `std::placeholders::_1, _2...` 则相当于为新适配⽣成的函数
// 对象的调⽤预留⼀个参数进⾏传递
// 基于bind的作⽤，当我们在设计⼀些线程池，或者任务池的时候，就可以将将任务池中的任务设置为
// 函数类型，函数的参数由添加任务者直接使⽤bind进⾏适配绑定设置，⽽任务池中的任务被处理，只
// 需要取出⼀个个的函数进⾏执⾏即可。
// 这样做有个好处就是，这种任务池在设计的时候，不⽤考虑都有哪些任务处理⽅式了，处理函数该如
// 何设计，有多少个什么样的参数，这些都不⽤考虑了，降低了代码之间的耦合度。